/**
16.1 类型与类的区别
在 Java 里，一直到 jdk1.5 之前，我们说一个对象的类型(type)，都与它 的 class 是一一映射的，
通过获取它们的 class 对象，比如 String.class, int.class, obj.getClass() 等，
就可以判断它们的类型(type)是不 是一致的。
而到了 jdk1.5 之后，因为引入了泛型的概念，类型系统变得复杂了，并且因为jvm 选择了在运行时采用类型擦拭的做法(兼容性考虑)
类型已经不能 单纯的用 class 来区分了，比如 List 和 List 的 class 都是 Class，然而两者类型(type)却是不同的。
泛型类型的信息要通过反射的技巧来获取，同时 java 里增加了 Type 接口来表达更泛的类型，
这样对于 List这样由类型构造器和类型参数组成的类型，可以通过 Type 来 描述;
它和 List 类型的对应的 Type 对象是完全不同的。
在 Scala 里，类型系统又比 java 复杂很多，泛型从一开始就存在，还支持高阶的概念(后续会讲述)。
所以它没有直接用Java 里的 Type 接口，而是自己提供了一个 scala.reflect.runtime.universe.Type(2.10 后)
  */
import scala.reflect.runtime.universe._      // for runtime reflection
class A
//在 scala 里获取类型信息是比较便捷的:
typeOf[A]
//scala 里获取类(Class)信息也很便捷，类似:
classOf[A]

val a = new A

a.getClass

trait T

classOf[T]

typeOf[T]